package cn.tedu.d18_design;
/*
本类用于测试单例设计模式2---懒汉式

总结：
1.延迟加载思想，你需要用对象的时候再为你创建(加载资源)对象
2.线程安全问题：多线程场景+共享数据+多条语句操作共享数据---(隐患)
         解决：加锁(同步代码块/同步方法)
3.饿/懒汉式的区别：
   饿汉式不管你需不需要对象，都先帮你创建出来
   懒汉式，先不给你创建对象，等你需要的时候再创建---延迟加载
 */
public class Singleton2 {
    public static void main(String[] args) {

        //测试单例模式---懒汉式
        MySingle2 m = MySingle2.getMySingle();
        MySingle2 m2 = MySingle2.getMySingle();
        System.out.println(m==m2);


    }

}

class MySingle2{

    private MySingle2(){}

    /*
     程序中有共享资源single，并切被多条语句操作
     此时single会出现多线程数据安全隐患
     解决：加锁---包裹所有操作共享资源的语句
     1.同步代码块
     2.同步方法(方法中所有代码块都被同步了，可以修饰成同步方法)
     */

    //在类的内部创建一个引用类型变量--延迟加载
    static private MySingle2 single;

    static Object o=new Object();
    //4.对外提供全局访问点
    static public MySingle2 getMySingle(){
        //synchronized (this) { 报错，静态资源随着类的加载而加载，优先于对象(this)
        synchronized (o) {
            //当用户调用方法时，才说明需要本类对象，再返回
            if (single == null) {
                single = new MySingle2();
            }
            return single;//静态不能调用非静态
        }
    }
}
